// const target = {
//   name: "Alice",
//   age: 30,
// };
// const handler = {
//   get: function (obj, prop) {
//     return prop in obj ? obj[prop] : "Property not found";
//   },
//   set: function (obj, prop, value) {
//     if (prop === "age" && typeof value !== "number") {
//       throw new Error("Age must be a number");
//     }
//     obj[prop] = value;
//     return true;
//   },
// };
// const proxy = new Proxy(target, handler);

// try {
//   // console.log(proxy.name);
//   // console.log(proxy.unknown); // Property not found
//   // proxy.age = 25;
//   proxy.age = "25"; // 报错： Age must be a number
// } catch (error) {
//   console.log("报错：", error.message);
// }

// const target = {};
// Object.defineProperty(target, "name", {
//   configurable: false,
//   writable: false,
//   value: "Alice",
// });
// const handler = {
//   get() {
//     return "Mark";
//   },
// };
// const proxy = new Proxy(target, handler);
// console.log(proxy.name); // TypeError

// const target = {
//   name: "Alice",
// };
// const handler = {
//   get(obj, prop) {
//     return obj[prop];
//   },
// };
// const { proxy, revoke } = Proxy.revocable(target, handler);
// console.log(proxy.name); // Alice
// console.log(target.name); // Alice

// //撤销代理
// revoke();
// console.log(proxy.name); // TypeError: Cannot perform 'get' on a proxy that has been revoked

// function createObservable(target, callback) {
//   return new Proxy(target, {
//     set(obj, prop, value) {
//       const oldValue = obj[prop];
//       const result = Reflect.set(obj, prop, value);
//       if (oldValue !== value) {
//         callback(prop, oldValue, value);
//       }
//       return result;
//     },
//   });
// }
// const data = { count: 0, name: "Test" };
// const observable = createObservable(data, (prop, oldValue, newValue) => {
//   console.log(`Property ${prop} changed from ${oldValue} to ${newValue}`);
// });

// observable.count = 0;
// observable.count = 1; // Property count changed from 0 to 1
// observable.name = "Alice"; // Property name changed from Test to Alice

// function createNegativeIndexArray(array) {
//   return new Proxy(array, {
//     get(target, prop, receiver) {
//       const index = Number(prop);
//       if (index < 0) {
//         prop = String(target.length + index);
//       }
//       return Reflect.get(target, prop, receiver);
//     },
//   });
// }
// const arr = createNegativeIndexArray(["a", "b", "c", "d"]);
// console.log(arr[-1]); // d
// console.log(arr[-2]); // c
// console.log(arr[1]); // b

// const handler = {
//   get(target, property) {
//     if (property.startsWith("_")) {
//       throw new Error(`Access to private property '${property}' is denied`);
//     }
//     return Reflect.get(target);
//   },
//   set(target, property, value) {
//     if (property.startsWith("_")) {
//       throw new Error(`Cannot set private property '${property}'`);
//     }
//     return Reflect.set(target, property, value);
//   },
//   has(target, property) {
//     if (property.startsWith("_")) {
//       return false;
//     }
//     return Reflect.has(target, property);
//   },
//   ownKeys(target) {
//     return Reflect.ownKeys(target).filter((key) => !key.startsWith("_"));
//   },
// };
// const obj = new Proxy(
//   {
//     name: "Public",
//     _secret: "Private data",
//   },
//   handler
// );

// console.log(obj.name); // "Public"
// // console.log(obj._secret); // Error: Access to private property '_secret' is denied
// console.log("_secret" in obj); // false
// console.log(Object.keys(obj)); // ["name"]

// function sum(num1, num2) {
//   return num1 + num2;
// }
// console.log(sum(10, 10)); // 20

// let anotherSum = sum;
// console.log(anotherSum(10, 10)); // 20

// sum = null;
// console.log(anotherSum(10, 10)); // 20

// function foo() {}
// let bar = function () {};
// let baz = () => {};
// console.log(foo.name); // foo
// console.log(bar.name); // bar
// console.log(baz.name); // baz
// console.log((() => {}).name); // (空字符串)
// console.log(new Function().name); // anonymous

// function foo() {}
// console.log(foo.bind(null).name); // bound foo
// let dog = {
//   years: 1,
//   get age() {
//     return this.years;
//   },
//   set age(newAge) {
//     this.years = newAge;
//   },
// };
// let propertyDescriptor = Object.getOwnPropertyDescriptor(dog, "age");
// console.log(propertyDescriptor.get.name); // get age
// console.log(propertyDescriptor.set.name); // set age

// function sayHi(name, message) {
//   console.log("Hello " + name + ", " + message);
// }
// function sayHi2() {
//   console.log("Hello " + arguments[0] + ", " + arguments[1]);
// }
// sayHi("Alice", "see you tomorrow"); // Hello Alice, see you tomorrow
// sayHi2("Alice", "see you tomorrow"); // Hello Alice, see you tomorrow

// function factorial(num) {
//   if (num <= 1) {
//     return 1;
//   } else {
//     return num * arguments.callee(num - 1);
//   }
// }
// let trueFactorial = factorial;
// factorial = function () {
//   return 0;
// };
// console.log(trueFactorial(5)); // 120
// console.log(factorial(5)); // 0

// 普通函数调用
// function normalFunc() {
//   console.log(this); // 非严格模式：全局对象；严格模式：undefined
// }
// normalFunc();

// //方法调用
// var obj = {
//   method: function () {
//     console.log(this); // obj
//   },
// };
// obj.method();

// //构造函数调用
// function Constructor() {
//   this.property = "value";
//   console.log(this); // 新创建的对象实例
// }
// let instance = new Constructor();

// //使用call和apply
// function func() {
//   console.log(this);
// }
// let customThis = { name: "custom" };
// func.call(customThis); // customThis
// func.apply(customThis); // customThis

// //使用bind
// let boundFunc = func.bind(customThis);
// boundFunc(); // customThis

// function King() {
//   if (!new.target) {
//     throw new Error('King must be instantiated using "new"');
//   }
//   console.log('King instantiated using "new"');
// }
// new King(); // King instantiated using "new"
// King(); // Error: King must be instantiated using "new"

// function sayName(name) {
//   console.log(name);
// }
// function sum(num1, num2) {
//   return num1 + num2;
// }
// function sayHi() {
//   console.log("hi");
// }
// console.log(sayName.length); // 1
// console.log(sum.length); // 2
// console.log(sayHi.length); // 0

// function greet(messsage1, message2) {
//   console.log(`${messsage1},${this.name}. ${message2}`);
// }
// const person = { name: "Bob" };

// greet.apply(person, ["Hello", "How are you?"]); // 输出：Hello, Bob. How are you?

// function greet(message) {
//   console.log(`${message}, ${this.name}`);
// }

// const person = { name: "Charlie" };
// const greetCharlie = greet.bind(person, "Hi");
// greetCharlie();

//继承中调用父构造函数
// function Parent(name) {
//   this.name = name;
// }
// function Child(name, age) {
//   Parent.call(this, name); // 调用父构造函数，继承属性
//   this.age = age;
// }

// const child = new Child("David", 10);
// console.log(child); //  name: 'David', age: 10 }

// const numbers = [5, 6, 2, 3, 7];
// const max = Math.max.apply(null, numbers);
// console.log(max); // 7

// const max2 = Math.max(...numbers);
// console.log(max2); // 7

// Function.prototype.myCall = function (context, ...args) {
//   // 如果context是null或undefined，默认指向全局对象(浏览器中为window)
//   context = context || window;
//   // 将当前函数作为context的一个方法
//   const fn = Symbol("fn");
//   context[fn] = this;
//   // 调用函数，传递参数
//   const result = context[fn](...args);
//   // 删除添加的方法
//   delete context[fn];
//   return result;
// };

// Function.prototype.myApply = function (context, argsArray) {
//   // 如果context是null或undefined，默认指向全局对象(浏览器中为window)
//   context = context || window;
//   // 将当前函数作为context的一个方法
//   const fn = Symbol("fn");
//   context[fn] = this;
//   // 调用函数，传递参数
//   const result = context[fn](...argsArray);
//   // 删除添加的方法
//   delete context[fn];
//   return result;
// };
// Function.prototype.myBind = function (context, ...bindArgs) {
//   const self = this;
//   return function (...callArgs) {
//     // 合并绑定参数和调用参数
//     const args = bindArgs.concat(callArgs);
//     return self.apply(context, args);
//   };
// };

// function greet(message) {
//   console.log(`${message},I am ${this.name}`);
// }

// const obj = { name: "Alice" };
// const greetCharlie = greet.myBind(obj);

// greet.myCall(obj, "Hello"); // Hello,I am Alice
// greet.myApply(obj, ["Hi"]); // Hi, I am Alice
// greetCharlie("Welcome"); // Welcome,I am Alice

let count = 5;
// for (var i = 0; i < count; i++) {
//   console.log(i);
// }
// console.log(i); // 5

(function () {
  for (var i = 0; i < count; i++) {
    console.log(i);
  }
})();
console.log(i); // i is not defined
